﻿using System.Collections.Generic;
using Studio7i.Dominio;
using Studio7i.Persistencia;

namespace Studio7i.Negocio
{
    public class AdministracionServiceImpl : IAdministracionService
    {
        #region Dependencias
        ILocalDAO localDAO = null;
        ISalaDAO salaDAO = null;
        IClienteDAO clienteDAO = null;
        #endregion

        #region Operaciones de negocio
        public Sala InscribirSala(string nombre, int localCodigo, 
            int capacidad, string caracteristicas)
        {
            // Excepción si falta algún dato requerido
            if (nombre == null || localCodigo == 0 ||
                capacidad == 0 || caracteristicas == null)
                throw new DatosInsuficientesException("Faltan datos para crear la sala");
            // Excepción si ya se registró la misma sala (por nombre y código de local)
            Local localExistente = localDAO.Obtener(localCodigo);
            ICollection<Sala> salasEncontradas = salaDAO.ListarXBusqueda(
                null, nombre, null, null, localExistente, null);
            if (salasEncontradas.Count > 0)
                throw new EntidadRepetidaException("La sala ya existe");
            // Creación de la sala
            Sala salaACrear = new Sala();
            salaACrear.Nombre = nombre;
            salaACrear.Local = localExistente;
            salaACrear.Capacidad = capacidad;
            salaACrear.Caracteristicas = caracteristicas;
            return salaDAO.Crear(salaACrear);
        }
        #endregion

        #region Métodos de soporte para entidad Cliente
        public ICollection<Cliente> ListarClientes()
        {
            return clienteDAO.ListarTodos();
        }
        public ICollection<Cliente> ListarClientesXNombre(string nombre)
        {
            return clienteDAO.ListarXNombre(nombre);
        }
        #endregion

        #region Métodos de soporte para entidad Local
        public Local CrearLocal(Local localACrear)
        {
            ICollection<Local> existentes = localDAO.ListarXNombre(localACrear.Nombre);
            if (existentes.Count > 0)
                throw new EntidadRepetidaException("Local ya existente");
            return localDAO.Crear(localACrear);
        }
        public Local ObtenerLocal(int codigo)
        {
            return localDAO.Obtener(codigo);
        }
        public Local ModificarLocal(Local localAModificar)
        {
            return localDAO.Modificar(localAModificar);
        }
        public void EliminarLocal(Local localAEliminar)
        {
            localDAO.Eliminar(localAEliminar);
        }
        public ICollection<Local> ListarLocales()
        {
            return localDAO.ListarTodos();
        }
        public ICollection<Local> ListarLocalesXNombre(string nombre)
        {
            return localDAO.ListarXNombre(nombre);
        }
        #endregion

        #region Métodos de soporte para entidad Sala
        public Sala ObtenerSala(int Codigo)
        {
            return salaDAO.Obtener(Codigo);
        }
        public ICollection<Sala> ListarSalas(string nombre, int? localCodigo, 
            int? capacidad, string caracteristicas)
        {
            Local localExistente = null;
            if (localCodigo != null && localCodigo != 0)
                localExistente = localDAO.Obtener(localCodigo.Value);
            return salaDAO.ListarXBusqueda(
                null, nombre, caracteristicas, capacidad, localExistente, null);
        }
        #endregion
    }
}
